package br.com.toscano.contpedido.domain;

import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.OneToMany;
import javax.persistence.Table;
import javax.persistence.Temporal;
import javax.persistence.TemporalType;

import org.hibernate.annotations.Cascade;

@Entity
@Table(name="PEDIDO") 
public class Pedido extends ObjetoAbstrato {

	private static final long serialVersionUID = 13454534543354534L;

	@Id
	@Column(name="PEDI_ID")
	@GeneratedValue(strategy = GenerationType.IDENTITY)
	private Long id;
	
	@Temporal(TemporalType.DATE)
	@Column(name = "PEDI_DT_CADASTRO", length = 7, nullable=true)
	private Date dataCadastro = new Date();

	@Temporal(TemporalType.DATE)
	@Column(name = "PEDI_DT_ENTREGA", length = 7, nullable=true)
	private Date dataEntrega = new Date();

	@Column(name = "PEDI_VALOR_TOTAL_PEDIDO", nullable = false, precision = 19, scale = 2)
	private BigDecimal valorTotalPedido;
	
	@ManyToOne(fetch = FetchType.LAZY, optional = false)
	@JoinColumn(name = "STPE_ID")	
	private StatusPedido statusPedido = new StatusPedido(StatusPedido.ABERTO, "Aberto");

	@ManyToOne(fetch = FetchType.LAZY, optional = false)
	@JoinColumn(name = "CLIE_ID")
	private Cliente cliente;

	@ManyToOne(fetch = FetchType.LAZY, optional = true)
	@JoinColumn(name = "USUA_ID")
	private Usuario usuario;
	
	@Column(name = "PEDI_HORA", nullable=false, precision = 4, scale = 0)
	private Integer hora;
	
	@Column(name = "PEDI_MINUTO", nullable=false, precision = 4, scale = 0)
	private Integer minuto;

	@Column(name = "PEDI_PRODUZIDO", nullable = true)	
	private Byte produzido = NAO;

	@Temporal(TemporalType.DATE)
	@Column(name = "PEDI_DT_PRODUCAO", length = 7, nullable=true)
	private Date dataProducao;
	
	@Column(name = "PEDI_HORA_PRODUCAO", nullable=true, precision = 4, scale = 0)
	private Integer horaProducao;
	
	@Column(name = "PEDI_MINUTO_PRODUCAO", nullable=true, precision = 4, scale = 0)
	private Integer minutoProducao;

	@Column(name="PEDI_OBSERVACAO", nullable=true, length=255)
	private String observacao;

	@OneToMany(fetch = FetchType.EAGER, mappedBy = "pedido", orphanRemoval = true)
	private List<PedidoProduto> listaPedidoProduto = new ArrayList<PedidoProduto>(0);
	
	public Pedido() {
		super();
	}

	public int hashCode() {
		StringBuffer sb = new StringBuffer();
		
		sb.append(this.getId());
		
		return sb.toString().hashCode();
	}
	
	public boolean equals(Object obj) {
		if (this == obj)
			return true;
		if (obj == null)
			return false;
		if (getClass() != obj.getClass())
			return false;
		Pedido other = (Pedido) obj;
		 if ((id == null && other.id == null) || (id == 0 && other.id == 0)) {
				return true;
		}else if (id == null) {
			if (other.id != null)
				return false;
		} else if (!id.equals(other.id)) {
			return false;
		}
		return true;
	}

	public Long getId() {
		return id;
	}

	public void setId(Long id) {
		this.id = id;
	}

	public Date getDataCadastro() {
		if (dataCadastro == null) {
			dataCadastro = new Date();
		}
		return dataCadastro;
	}

	public void setDataCadastro(Date dataCadastro) {
		this.dataCadastro = dataCadastro;
	}

	public Date getDataEntrega() {
		return dataEntrega;
	}

	public void setDataEntrega(Date dataEntrega) {
		this.dataEntrega = dataEntrega;
	}

	public StatusPedido getStatusPedido() {
		return statusPedido;
	}

	public void setStatusPedido(StatusPedido statusPedido) {
		this.statusPedido = statusPedido;
	}

	public BigDecimal getValorTotalPedido() {
		return valorTotalPedido;
	}

	public void setValorTotalPedido(BigDecimal valorTotalPedido) {
		this.valorTotalPedido = valorTotalPedido;
	}

	public List<PedidoProduto> getListaPedidoProduto() {
		return listaPedidoProduto;
	}

	public void setListaPedidoProduto(List<PedidoProduto> listaPedidoProduto) {
		this.listaPedidoProduto = listaPedidoProduto;
	}

	public Cliente getCliente() {
		return cliente;
	}

	public void setCliente(Cliente cliente) {
		this.cliente = cliente;
	}

	public Usuario getUsuario() {
		return usuario;
	}

	public void setUsuario(Usuario usuario) {
		this.usuario = usuario;
	}

	public Integer getHora() {
		return hora;
	}

	public void setHora(Integer hora) {
		this.hora = hora;
	}

	public Integer getMinuto() {
		if (minuto == null) {
			minuto = 0;
		}
		return minuto;
	}

	public void setMinuto(Integer minuto) {
		this.minuto = minuto;
	}

	public Byte getProduzido() {
		return produzido;
	}

	public void setProduzido(Byte produzido) {
		this.produzido = produzido;
	}

	public Date getDataProducao() {
		return dataProducao;
	}

	public void setDataProducao(Date dataProducao) {
		this.dataProducao = dataProducao;
	}

	public Integer getHoraProducao() {
		return horaProducao;
	}

	public void setHoraProducao(Integer horaProducao) {
		this.horaProducao = horaProducao;
	}

	public Integer getMinutoProducao() {
		return minutoProducao;
	}

	public void setMinutoProducao(Integer minutoProducao) {
		this.minutoProducao = minutoProducao;
	}

	public String getObservacao() {
		return observacao;
	}

	public void setObservacao(String observacao) {
		this.observacao = observacao;
	}
}